package command

import (
	"bufio"
	"io"
	"os/exec"
)

// Command 命令行
type Command struct {
	Cmd    *exec.Cmd
	Stdin  io.WriteCloser // 标准输入
	Stdout *bufio.Reader  // 标准输出
	Stderr *bufio.Reader  // 标准错误
}

// Exec 执行命令
func (C *Command) Exec(cmd string) {
	// 将命令写到通道
	C.Stdin.Write([]byte(cmd + "\n"))
}

// Exit 执行命令
func (C *Command) Exit() error {
	return C.Cmd.Process.Kill()
}

// NewCmd 创建终端
func NewCmd(cmd string) (C *Command, err error) {
	// 创建对象
	C = &Command{}
	C.Cmd = exec.Command(cmd)
	// 标准输入
	C.Stdin, err = C.Cmd.StdinPipe()
	if err != nil {
		return
	}
	// 标准输出
	Stdout, err := C.Cmd.StdoutPipe()
	if err != nil {
		return
	}
	// 标准错误
	Stderr, err := C.Cmd.StderrPipe()
	if err != nil {
		return
	}
	// 输入输出变量
	C.Stdout = bufio.NewReader(Stdout)
	C.Stderr = bufio.NewReader(Stderr)
	// 启动
	go C.Cmd.Run()
	return
}
